package com.cibertec.proydawi.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.cibertec.proydawi.bean.ClienteDTO;
import com.cibertec.proydawi.bean.UsuarioDTO;
import com.cibertec.proydawi.dao.idao.IClienteDAO;
import com.cibertec.proydawi.utils.Entidad;
import com.cibertec.proydawi.utils.MySqlDBConn;


public class MysqlClienteDAO implements IClienteDAO
{
	
	//LISTADO TABLA ***
	public ResultSet ListadoTabla(String tabla)throws Exception
	{
		Connection cn=MySqlDBConn.obtenerConexion();
		String sql="select * from "+tabla;
		System.out.println("sql "+sql);
		PreparedStatement ps=cn.prepareStatement(sql);
		ResultSet rs=ps.executeQuery();
//		cn.close();
		return rs;
		//cn.close();
	}
	
	
	
	public ResultSet ListadoJoinTabla(String tabla1,String tabla2,
										List<Entidad> lst1,	List<Entidad> lst2,
										String key)throws Exception
	{
		Connection cn=MySqlDBConn.obtenerConexion();
		
		String sql="select ";// * from "+tabla;
		for (int i = 0; i < lst1.size(); i++) 
		{
			sql+="ta."+lst1.get(i).getKey()+",";
		}
		for (int j = 0; j < (lst2.size()-1); j++) 
		{
			sql+="tb."+lst2.get(j).getKey()+",";
		}
		sql+="tb."+lst2.get(lst2.size()-1).getKey();
		sql+="  from "+tabla1+" ta ";
		sql+=" inner join "+tabla2+" tb ";
		sql+= " on ta."+key+"="+" tb."+key;
		
		System.out.println("sql "+sql);
		PreparedStatement ps=cn.prepareStatement(sql);
		ResultSet rs=ps.executeQuery(); 
//		cn.close();
		return rs;
	}
	//INSERT TABLA ***
	public boolean InsertarTabla(List<Entidad> lst,String tabla,Boolean $key) throws Exception
	{
		boolean flag=false;
		Connection cn = MySqlDBConn.obtenerConexion();
		String  sql ="";
		int i=0;
		if(!$key)
		{
			 sql = " insert into "+tabla+"  values  (null "; //aqui no ingresas el key
		}else
		{
			 sql = " insert into "+tabla+"  values  ( ?";
			 i=1;
		}
		
		for (int j=i; j < (lst.size()-1); j++) 
		{
			sql+=",?";
		}
		sql+=",?)";
			
		System.out.println("InsertarTabla sql : "+sql);
		PreparedStatement  ps =  cn.prepareStatement(sql);

		for (int j = 0; j < lst.size(); j++) 
		{
			switch (lst.get(j).getType()) 
			{
				case Entidad.EBOOLEAN:
						ps.setBoolean((j+1), (Boolean)(lst.get(j).getValue()));
						break;
				case Entidad.EINT:
						ps.setInt((j+1), (Integer)(lst.get(j).getValue()));
						break;
				case Entidad.EFLOAT:
						ps.setFloat((j+1), (Float)(lst.get(j).getValue()));
						break;
				case Entidad.EDOUBLE:
						ps.setDouble((j+1), (Double)(lst.get(j).getValue()));
						break;
				case Entidad.ESTRING:
						ps.setString((j+1), (String)(lst.get(j).getValue()));
						break;
				default:
					break;
			}
		}
        ps.executeUpdate();
        flag=true;
        cn.close();
		return flag;
	}
	//MODIFICAR TABLA *** update usuario  set  pstring=? , pint=? , pboolean=? , pdouble=? where id = ?
		public boolean ModificarTabla(List<Entidad> lst,String tabla,Entidad en) throws Exception
		{
	         boolean  x = false;
	         Connection cn = MySqlDBConn.obtenerConexion();
	         String sql="update "+tabla+"  set  ";
	         for (int i = 0; i < lst.size(); i++) 
	         {
	        	 if(i<(lst.size()-1))
	        	 {
	        		 sql+= lst.get(i).getKey()+"=? , ";
	        	 }else
	        	 {
	        		sql+= lst.get(i).getKey()+"=? where "+en.getKey()+" = ?";
	        	 }
			 }	         
	         System.out.println("modificartabla "+sql);
	         PreparedStatement  ps =   cn.prepareStatement(sql);
	 		 for (int j = 0; j < lst.size(); j++) 
			 {
				switch (lst.get(j).getType()) 
				{
						case Entidad.EBOOLEAN:
								ps.setBoolean((j+1), (Boolean)(lst.get(j).getValue()));
								break;
						case Entidad.EINT:
								ps.setInt((j+1), (Integer)(lst.get(j).getValue()));
								break;
						case Entidad.EFLOAT:
								ps.setFloat((j+1), (Float)(lst.get(j).getValue()));
								break;
						case Entidad.EDOUBLE:
								ps.setDouble((j+1), (Double)(lst.get(j).getValue()));
								break;
						case Entidad.ESTRING:
								ps.setString((j+1), (String)(lst.get(j).getValue()));
								break;
						default:
								break;
				}
			 }
	 		 //--- entidad
			switch (en.getType()) 
			{
					case Entidad.EBOOLEAN:
							ps.setBoolean(lst.size()+1, (Boolean)(en.getValue()));
							break;
					case Entidad.EINT:
							ps.setInt(lst.size()+1, (Integer)(en.getValue()));
							break;
					case Entidad.EFLOAT:
							ps.setFloat(lst.size()+1, (Float)(en.getValue()));
							break;
					case Entidad.EDOUBLE:
							ps.setDouble(lst.size()+1, (Double)(en.getValue()));
							break;
					case Entidad.ESTRING:
							ps.setString(lst.size()+1, (String)(en.getValue()));
							break;
					default:
							break;
			}
	         ps.execute();
	         x=true;  
	         cn.close();
	         return  x;
		}
		/*
		 *     public boolean modificaProducto(ProductoDTO bean) throws Exception {
        boolean  x = false;
        Connection cn = MySqlDBConn.obtenerConexion();
         String   sql = "update   producto  set  " +
                 "   descripcion = ? , stock=?, precio=? "+
                 "   where   codigo= ? ";
         PreparedStatement  ps =   cn.prepareStatement(sql    );
         ps.setString(1,bean.getDescripcion());
         ps.setInt(2,bean.getStock());
         ps.setDouble(3,bean.getPrecio());
         ps.setInt(4,bean.getCodigo());
         ps.execute();
         x=true;
         System.out.println("producto modificado");         
        return  x;
    }
		 */
	//ELIMINAR TABLA ***
		public boolean EliminarTabla(String tabla,Entidad en)throws Exception
		{
			boolean  x = false;
	        Connection cn = MySqlDBConn.obtenerConexion();
	        
	        String   sql = "delete   from  "+ tabla+"  where  "+en.getKey()+ "= ?";
	        PreparedStatement  ps =   cn.prepareStatement(sql );
	        //ps.setInt(1, codigo);
			switch (en.getType()) 
			{
					case Entidad.EBOOLEAN:
							ps.setBoolean(1, (Boolean)(en.getValue()));
							break;
					case Entidad.EINT:
							ps.setInt(1, (Integer)(en.getValue()));
							break;
					case Entidad.EFLOAT:
							ps.setFloat(1, (Float)(en.getValue()));
							break;
					case Entidad.EDOUBLE:
							ps.setDouble(1, (Double)(en.getValue()));
							break;
					case Entidad.ESTRING:
							ps.setString(1, (String)(en.getValue()));
							break;
					default:
							break;
			}
			
	        ps.execute();
	        x=true;
	        cn.close();
	        
	        System.out.println("producto  fue  eliminado...");
	        return x;
		}
		/**
		 *
		public boolean beliminaProducto(Integer codigo) throws Exception {
        Connection cn = MySqlDBConn.obtenerConexion();
        boolean  x =  false;
        String   sql = "delete   from  producto   where  codigo = ?";
        PreparedStatement  ps =   cn.prepareStatement(sql    );
        ps.setInt(1, codigo);
        ps.execute();
        x=true;
        System.out.println("producto  fue  eliminado...");
        cn.close();
        return x;
    }
		 */
	//LOAD COMBOBOX --------
	public ResultSet ListadoCombo(String tabla,String id,String desc)throws Exception
	{
		Connection cn=MySqlDBConn.obtenerConexion();
		
		String sql="select ";//* from "+tabla;
		sql+= id+",";
		sql+= desc;
		sql+=" from "+tabla;
		
		System.out.println("ListadoCombo sql "+sql);
		
		PreparedStatement ps=cn.prepareStatement(sql);
		ResultSet rs=ps.executeQuery();
//			cn.close();
		return rs;
		//cn.close();
	}	
	/*
	public boolean InsertarTabla(BeanDTO bean,String tabla) throws Exception
	{
		boolean flag=false;
		Connection cn = MySqlDBConn.obtenerConexion();
		String  sql = " insert into "+tabla+"  values  (null, ?,?,?)";
		System.out.println("InsertarTabla sql : "+sql);
		PreparedStatement  ps =  cn.prepareStatement(sql);
		
        ps.executeUpdate();
        flag=true;
        cn.close();
        
		return flag;
	}
	//INSERT --------------------------------------------
	    @Override
    public boolean registraProducto(ProductoDTO bean) throws Exception {
        Connection cn = MySqlDBConn.obtenerConexion();
        boolean   flag=false;
          String  sql = " insert into producto  values  (null, ?,?,?)";
          PreparedStatement  ps =  cn.prepareStatement(sql);
          ps.setString(1, bean.getDescripcion());
          ps.setInt(2, bean.getStock());
          ps.setDouble(3,bean.getPrecio());
          ps.executeUpdate();
          flag=true;
          cn.close();
        return flag;
    }
    	@Override
	public List<ClienteDTO> listadoCliente(String tb) throws Exception
	{
		// TODO Auto-generated method stub
		List<ClienteDTO> lista =new ArrayList<ClienteDTO>();
		
		Connection cn=MySqlDBConn.obtenerConexion();
		String sql="select * from "+tb;
		PreparedStatement ps=cn.prepareStatement(sql);
		ResultSet rs=ps.executeQuery();
		
		while   (rs.next())
		{
			ClienteDTO p=new ClienteDTO();
			p.setUsuario(rs.getString(1));
			p.setClave(rs.getString(2));
			lista.add(p);
		}
		return lista;
	}
	  public List<ProductoDTO> listaPorDescripcion(String desc) throws Exception {
        List<ProductoDTO>  lista  = new ArrayList<ProductoDTO>();
        Connection cn = MySqlDBConn.obtenerConexion();
        String    sql = "select * from  producto where  descripcion like  ?";
        PreparedStatement  ps =  cn.prepareStatement(sql);
        ps.setString(1,"%"+desc+"%");
        ResultSet  rs =  ps.executeQuery();
        while   (rs.next()){
            ProductoDTO   p = new ProductoDTO();
            p.setCodigo(rs.getInt(1));
            p.setDescripcion(rs.getString(2));
            p.setStock(rs.getInt(3));
            p.setPrecio(rs.getDouble(4));
            //agregar el  objeto a la lista
            lista.add(p);        
        }       
        return lista;        
    }
	 */

}
